class GBD:
    __caminho = "caminho do arquivo"

    ##
    # Construtor
    # @param caminho indica o caminho do self.arquivo texto do BD
    def __init__( self, caminho ):
        self.__caminho = caminho
        #print "> arquivo de BD: " + self.__caminho

    ##
    # Abre self.arquivo de BD e trata erro
    # @param modo modo de abertura do self.arquivo (r ou w)
    # @return mensagem de erro ou "ok", caso sucesso
    def abreBD( self, modo ):
        # tenta abrir bd
        try:
            self.arq = open(self.__caminho, modo )
            return "ok"
        # caso de erro
        except IOError:
            return "> Erro ao abrir BD"

    ##
    # Fecha self.arquivo de BD e trata erro
    # @return mensagem de erro ou "ok", caso sucesso
    def fechaBD( self ):
        # tenta abrir bd
        try:
            self.arq.close()
            return "ok"
        # caso de erro
        except IOError:
            return "> Erro ao fechar BD"

    ##
    # Adiciona novo produto ao BD
    # @param item nome do novo produto
    # @param qtde quantidade do novo produto
    # @return mensagem de erro ou "ok", caso sucesso
    def criaProduto( self, item, qtde ):
        # verifica se os parametros estao corretos
        if not isinstance(qtde, int):
            return "> Parametro 'qtde' nao e' do tipo int"

        # recupera BD
        resp = self.abreBD("r")
        if (resp != "ok"): # trata erro
            self.fechaBD()
            return resp
        # le BD
        bd = self.arq.readlines()

        self.fechaBD()
        
        # verifica se o item nao existe
        for i in range(0, len(bd)):
            linha = bd[i].split(":")
            if (linha[0] == item):
                self.fechaBD()
                return "> Impossivel criar, " + item + " ja existe no BD"
        # adiciona item
        bd.append(item + ":" + str(qtde) + "\n")

        # atualiza BD
        resp = self.abreBD("w")
        if (resp != "ok"): # trata erro
            return resp
        for i in range(0, len(bd)):
            self.arq.write(bd[i])
        self.fechaBD()

        # imprime BD
        resp = self.printbd()
        if (resp != "ok"): # trata erro
            return resp

        return "ok"

    ##
    # Aumenta a quantidade de um produto
    # @param item nome produto alvo
    # @param qtde quantidade a ser subtraida
    # @return mensagem de erro ou "ok", caso sucesso
    def aumentaProduto( self, item, qtde ):
        # verifica se os parametros estao corretos
        if not isinstance(qtde, int):
            return "> Parametro 'qtde' nao e' do tipo int"

        # recupera BD
        resp = self.abreBD("r")
        if (resp != "ok"): # trata erro
            return resp
        # le BD
        bd = self.arq.readlines()

        self.fechaBD()
        
        # executa operacao
        itemExiste = False
        for i in range(0, len(bd)):
            linha = bd[i].split(":")
            if (linha[0] == item):
                # adicao
                itemExiste = True
                linha[1] = str(int(linha[1]) + int(qtde))
                bd[i] = linha[0] + ":" + linha[1] + "\n"

        # para item inexistente
        if not itemExiste:
            return "> " + item + " nao existe"

        # atualiza BD
        resp = self.abreBD("w")
        if (resp != "ok"): # trata erro
            return resp
        for i in range(0, len(bd)):
            self.arq.write(bd[i])
        self.fechaBD()

        # imprime BD
        resp = self.printbd()
        if (resp != "ok"): # trata erro
            return resp

        return "ok"

    ##
    # Diminui a quantidade de um produto
    # @param item nome produto alvo
    # @param qtde quantidade a ser adicionada
    # @return mensagem de erro ou "ok", caso sucesso
    def diminuiProduto( self, item, qtde ):
        # verifica se os parametros estao corretos
        if not isinstance(qtde, int):
            return "> Parametro 'qtde' nao e' do tipo int"

        # recupera BD
        resp = self.abreBD("r")
        if (resp != "ok"): # trata erro
            return resp
        # le BD
        bd = self.arq.readlines()

        self.fechaBD()
        
        # executa operacao
        itemExiste = False
        for i in range(0, len(bd)):
            linha = bd[i].split(":")
            if (linha[0] == item):
                # adicao
                itemExiste = True
                linha[1] = str(int(linha[1]) - int(qtde))
                bd[i] = linha[0] + ":" + linha[1] + "\n"

        # para item inexistente
        if not itemExiste:
            return "> " + item + " nao existe"

        # atualiza BD
        resp = self.abreBD("w")
        if (resp != "ok"): # trata erro
            return resp
        for i in range(0, len(bd)):
            self.arq.write(bd[i])
        self.fechaBD()

        # imprime BD
        resp = self.printbd()
        if (resp != "ok"): # trata erro
            return resp

        return "ok"
    ##
    # Retorna a quantidade de um produto
    # @param item nome produto alvo
    # @return mensagem de erro ou a quantidade, caso sucesso
    def quantidadeProduto( self, item ):
        # recupera BD
        resp = self.abreBD("r")
        if (resp != "ok"): # trata erro
            return resp
        # le BD
        bd = self.arq.readlines()

        self.fechaBD()

        # executa operacao
        itemExiste = False
        for i in range(0, len(bd)):
            linha = bd[i].split(":")
            if (linha[0] == item):
                itemExiste = True
                resp = linha[1] # quantidade

        # para item inexistente
        if not itemExiste:
            self.fechaBD()
            return "> " + item + " nao existe"

        return int(resp)

    ##
    # Retorna a lista dos produtos
    # @return mensagem de erro ou a quantidade, caso sucesso
    def listaProduto( self ):
        # recupera BD
        resp = self.abreBD("r")
        if (resp != "ok"): # trata erro
            return resp
        # le BD
        bd = self.arq.readlines()

        self.fechaBD()        

        # executa operacao
        lista = ""
        for i in range(0, len(bd)):
            lista = lista + bd[i]

        return lista
        
    ##
    # Imprime o Banco de dados
    # Note: rotina voltada para testes
    def printbd( self ):
        # recupera BD
        resp = self.abreBD("r")
        if (resp != "ok"): # trata erro
            return resp
        # le BD         
        bd = self.arq.readlines()

        self.fechaBD()

        # imprime
        for i in range(0, len(bd)):
            print bd[i]

        return "ok"


# -- fim class GBD --
